﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//第二讲：C语言数据类型和变量

//内置类型（C语言本身就有的）：字符型、整型、浮点型、布尔类型
//自定义类型（自己创造的）：数组、结构体-struct、枚举 - enum、联合体 - union

//表示真/假的变量 - _Bool
//布尔类型的使用得包含头文件 - <stdbool.h>

//#include <stdbool.h>
//int main()
//{
//	_Bool flag = true;
//
//	if (flag)
//		printf("hehe\n", flag);
//
//	return 0;
//}

//sizeof 是⼀个关键字，也是操作符，专⻔是⽤来计算sizeof的操作符数的类型⻓度的，单位是字节。
//int main()
//{
//	printf("%zd\n", sizeof(char));
//	printf("%zd\n", sizeof(short));
//	printf("%zd\n", sizeof(int));
//	printf("%zd\n", sizeof(long));
//	printf("%zd\n", sizeof(long long));
//	printf("%zd\n", sizeof(float));
//	printf("%zd\n", sizeof(double));
//	printf("%zd\n", sizeof(long double));
//
//	return 0;
//}



//int main()
//{
//	int a = 10;
//	printf("%zd\n", sizeof(int));
//	printf("%zd\n", sizeof a);// a是变量的名字，可以省略掉sizeof后边的()
//	return 0;
//}



//C 语⾔使⽤ signed 和 unsigned 关键字修饰 字符型和整型 类型的。
//signed 关键字，表⽰⼀个类型带有正负号，包含负值；
//unsigned 关键字，表⽰该类型不带有正负号，只能表⽰零和正整数。
//对于 int 类型，默认是带有正负号的，也就是说 int 等同于 signed int 。
//由于这是默认情况，关键字 signed ⼀般都省略不写，但是写了也不算错。

//int main()
//{
//	/*int num = 100;
//	num = -200;*/
//
//	//signed int - 有符号的int
//	signed int num = 100;
//
//
//	//usigned int
//	unsigned int num2 = 100;
//	num2 = 1000;
//
//
//	return 0;
//}


//char - char到底 有符号还是无符号？这个不确定，是取决于编译器的实现。
//大部分的编译器上char == signed char
//signed char
//unsigned cgar


//int是有符号还是无符号呢？
//int == signed int 是有符号的int
//对于有符号的整数打印应该使用%d
//对于无符号整数的打印应该使用%u



//整数变量声明为 unsigned 的好处是，同样⻓度的内存能够表⽰的最⼤整数值，增⼤了⼀倍。
//⽐如，16位的 signed short int 的取值范围是： - 32768~32767，最⼤是32767；
//⽽unsigned short int 的取值范围是：0~65535，最⼤值增⼤到了65535。


////变量
//#include <stdbool.h>
//int num = 100;//全局变量
//
//int main()
//{
//	//局部变量
//	unsigned int age = 10;//要初始化
//	age = 20;//赋值
//
//	printf("%u", age);
//	char ch = 'q';
//	float score = 3.14f;
//	double weight = 4.5;
//	bool flag = true;
//  return 0;
//}


//int main() {
//	{
//		int num = 10;
//		printf("%d\n", num);
//	}
//	printf("%d\n", num);//err
//	return 0;
//	
//}


//当全局变量和局部变量名字相同的时候，优先使用局部变量


//C语⾔中为了⽅便运算，提供了⼀系列操作符，其中有⼀组操作符叫：算术操作符。
//分别是： + - * / % ，这些操作符都是双⽬操作符。
//双目操作符的意思是，有两个操作数
//int main()
//{
//	printf("%d\n", 33 + 42);
//	int a = 10;
//	int b = 20;
//	printf("%d\n", a + b);
//	printf("%d\n", a + 32);
//
//	return 0;
//}

//int main()
//{
//	printf("%d\n", 33 - 42);
//	int a = 10;
//	int b = 20;
//	printf("%d\n", a - b);
//	printf("%d\n", a - 32);
//
//	return 0;
//}

//int main()
//{
//	printf("%d\n", 5 * 5);
//	int a = 10;
//	int b = 20;
//	printf("%d\n", a * b);
//	printf("%d\n", a * 10);
//
//	return 0;
//}

//int main()
//{
//
//	printf("%d\n", 9 / 3);
//	printf("%d\n", 10 / 4);//得到是商，是个整数
//
//	//如果希望得到浮点数的结果，两个运算数必须⾄少有⼀个浮点数，这时 C 语⾔就会进⾏浮点数除法。
//	printf("%.1f\n", 10 / 4.0);
//	printf("%.2f\n", 10.0 / 4); 
//	printf("%.3f\n", 10.0 / 4.0);
//
//	int score = 5;
//	//score = (score / 20) * 100;//0
//	score = (score / 20.0) * 100;//25
//
//	printf("%d\n", score);
//
//	return 0;
//}

////%：取模
////运算符 % 表⽰求模(余)运算，即返回两个整数相除的余值。这个运算符只能⽤于整数，不能⽤于浮点数。
//int main()
//{
//	printf("%d\n", 10 % 3);
//	if (8 % 2 == 0)
//		printf("hehe\n");
//
//	return 0;
//}

////负数求模的规则是，结果的正负号由第⼀个运算数的正负号决定。
//int main()
//{
//	printf("%d\n", 11 % -5);
//	printf("%d\n", -11 % -5);
//	printf("%d\n", -11 % -5);
//
//	return 0;
//}


////复合赋值
//int mian()
//{
//	int a = 10;
//	a = a + 3;//a += 3;
//	a = a - 2;//a -= 2;
//
//	return 0;
//}


////++是⼀种⾃增的操作符，⼜分为前置++和后置++，--是⼀种⾃减的操作符，也分为前置--和后置--.
//int main()
//{
//	int a = 5;
//
//	//前置++
//	//口诀：先++，后使用
//	//a=a+1,b=a  a=6,b=6
//	//int b = ++a;
//	
//	// 前置--
//	//int b = --a;
//	//printf("b= %d\n", b);
//
//	//后置++
//	//口诀：先使用，后++
//	//c=a,a=a+1  c=5,a=6
//	//int c = a++;
//
//	//后置--
//	int c = a--;
//	printf("c = %d\n", c);
//
//	return 0;
//}


//强制转换
int main()
{
	//a的是int类型, 3.14是double类型，两边的类型不⼀致，编译器会报警告
	int a = (int)3.14;//强制转换为整型
	printf("%d\n", a);
	return 0;
}